using System;
using System.Collections.Generic;
using System.Linq;
using Mbs.Collections;
using Mbs.ComponentModel.Container;

namespace Mbs.Modularity
{
    [Serializable]
    [Component(Service=typeof(IModuleRepository))]
    public class ModuleRepository : IModuleRepository
    {
        private IMap<int, IModule> modules;

        public int Count
        {
            get
            {
                return modules.Count;
            }
        }

        public ModuleRepository()
        {
            this.modules = new ConcurrentMap<int, IModule>();
        }

        public IModule[] GetModules()
        {
            return modules.Values.ToArray();
        }

        public IModule this[int moduleId]
        {
            get { return GetModule(moduleId); }
        }

        public IModule GetModule(int moduleId)
        {
            if (modules.ContainsKey(moduleId))
                return (Module)modules[moduleId];
            return null;
        }


        public IModule GetModule(string name)
        {
            var result = from item in modules.Values
                         where item.Meta.Name == name
                         select item;
            return result.FirstOrDefault();
        }


        public IModule GetModuleByAddInName(string addinName)
        {
            if (modules.Count < 1) return null;
            return modules.Values.FirstOrDefault((item) => item.Meta.AddIn != null && item.Meta.AddIn.Name == addinName);
        }

        public void Register(IModule module)
        {
            modules.Add(module.Id, module);
        }

        public bool Unregister(IModule module)
        {
            modules.Remove(module.Id);
            return true;
        }
    }
}
